GDK_NOTE (DND, g_print ("Calling DoDragDrop\n"));
- _gdk_win32_begin_modal_call ();
+ _gdk_win32_begin_modal_call (GDK_WIN32_MODAL_OP_DND);
hr = DoDragDrop (&dobj->ido, &pending_src_context->ids,
DROPEFFECT_COPY | DROPEFFECT_MOVE,
&dwEffect);
- _gdk_win32_end_modal_call ();
+ _gdk_win32_end_modal_call (GDK_WIN32_MODAL_OP_DND);
GDK_NOTE (DND, g_print ("DoDragDrop returned %s\n",
(hr == DRAGDROP_S_DROP ? "DRAGDROP_S_DROP" :
{
int arbitrary_limit = 10;
- while (_modal_operation_in_progress &&
+ while (_modal_operation_in_progress != GDK_WIN32_MODAL_OP_NONE &&
g_main_context_pending (NULL) &&
arbitrary_limit--)
g_main_context_iteration (NULL, FALSE);
}
void
-_gdk_win32_begin_modal_call (void)
+_gdk_win32_begin_modal_call (GdkWin32ModalOpKind kind)
{
- g_assert (!_modal_operation_in_progress);
+ GdkWin32ModalOpKind was = _modal_operation_in_progress;
+ g_assert (!(_modal_operation_in_progress & kind));
- _modal_operation_in_progress = TRUE;
+ _modal_operation_in_progress |= kind;
- modal_timer = SetTimer (NULL, 0, 10, modal_timer_proc);
- if (modal_timer == 0)
- WIN32_API_FAILED ("SetTimer");
+ if (was == GDK_WIN32_MODAL_OP_NONE)
+ {
+ modal_timer = SetTimer (NULL, 0, 10, modal_timer_proc);
+
+ if (modal_timer == 0)
+ WIN32_API_FAILED ("SetTimer");
+ }
}
void
-_gdk_win32_end_modal_call (void)
+_gdk_win32_end_modal_call (GdkWin32ModalOpKind kind)
{
- g_assert (_modal_operation_in_progress);
+ g_assert (_modal_operation_in_progress & kind);
- _modal_operation_in_progress = FALSE;
+ _modal_operation_in_progress &= ~kind;
- if (modal_timer != 0)
+ if (_modal_operation_in_progress == GDK_WIN32_MODAL_OP_NONE &&
+ modal_timer != 0)
{
API_CALL (KillTimer, (NULL, modal_timer));
modal_timer = 0;
- }
+ }
}
static VOID CALLBACK
break;
case WM_ENTERSIZEMOVE:
- case WM_ENTERMENULOOP:
- if (msg->message == WM_ENTERSIZEMOVE)
- _modal_move_resize_window = msg->hwnd;
-
- _gdk_win32_begin_modal_call ();
+ _modal_move_resize_window = msg->hwnd;
+ _gdk_win32_begin_modal_call (GDK_WIN32_MODAL_OP_SIZEMOVE_MASK);
break;
case WM_EXITSIZEMOVE:
- case WM_EXITMENULOOP:
- if (_modal_operation_in_progress)
+ if (_modal_operation_in_progress & GDK_WIN32_MODAL_OP_SIZEMOVE_MASK)
{
_modal_move_resize_window = NULL;
- _gdk_win32_end_modal_call ();
+ _gdk_win32_end_modal_call (GDK_WIN32_MODAL_OP_SIZEMOVE_MASK);
}
break;
+ case WM_ENTERMENULOOP:
+ _gdk_win32_begin_modal_call (GDK_WIN32_MODAL_OP_MENU);
+ break;
+
+ case WM_EXITMENULOOP:
+ if (_modal_operation_in_progress & GDK_WIN32_MODAL_OP_MENU)
+ _gdk_win32_end_modal_call (GDK_WIN32_MODAL_OP_MENU);
+ break;
+
+ break;
+
case WM_CAPTURECHANGED:
/* Sometimes we don't get WM_EXITSIZEMOVE, for instance when you
select move/size in the menu and then click somewhere without
moving/resizing. We work around this using WM_CAPTURECHANGED. */
- if (_modal_operation_in_progress)
+ if (_modal_operation_in_progress & GDK_WIN32_MODAL_OP_SIZEMOVE_MASK)
{
_modal_move_resize_window = NULL;
- _gdk_win32_end_modal_call ();
+ _gdk_win32_end_modal_call (GDK_WIN32_MODAL_OP_SIZEMOVE_MASK);
}
impl = GDK_WINDOW_IMPL_WIN32 (window->impl);
}
/* Call modal timer immediate so that we repaint faster after a resize. */
- if (_modal_operation_in_progress)
+ if (_modal_operation_in_progress & GDK_WIN32_MODAL_OP_SIZEMOVE_MASK)
modal_timer_proc (0,0,0,0);
/* Claim as handled, so that WM_SIZE and WM_MOVE are avoided */
const guchar *data,
gint nelements);
-void _gdk_win32_begin_modal_call (void);
-void _gdk_win32_end_modal_call (void);
+typedef enum {
+ GDK_WIN32_MODAL_OP_NONE = 0x0,
+ GDK_WIN32_MODAL_OP_SIZE = 0x1 << 0,
+ GDK_WIN32_MODAL_OP_MOVE = 0x1 << 1,
+ GDK_WIN32_MODAL_OP_MENU = 0x1 << 2,
+ GDK_WIN32_MODAL_OP_DND = 0x1 << 3
+} GdkWin32ModalOpKind;
+
+#define GDK_WIN32_MODAL_OP_SIZEMOVE_MASK (GDK_WIN32_MODAL_OP_SIZE | GDK_WIN32_MODAL_OP_MOVE)
+
+/* Non-zero while a modal sizing, moving, or dnd operation is in progress */
+extern GdkWin32ModalOpKind _modal_operation_in_progress;
+
+extern HWND _modal_move_resize_window;
+
+void _gdk_win32_begin_modal_call (GdkWin32ModalOpKind kind);
+void _gdk_win32_end_modal_call (GdkWin32ModalOpKind kind);
/* Options */
#define GDK_WIN32_COLORMAP_DATA(cmap) ((GdkColormapPrivateWin32 *) GDK_COLORMAP (cmap)->windowing_data)
-/* TRUE while a modal sizing, moving, or dnd operation is in progress */
-extern gboolean _modal_operation_in_progress;
-
-extern HWND _modal_move_resize_window;
-
/* TRUE when we are emptying the clipboard ourselves */
extern gboolean _ignore_destroy_clipboard;